﻿using Vk.Methods.Market;
using Vk.Methods.Photos;

namespace Vk.Methods.Common.AttachmentTypes
{
    /// <summary>
    ///     Вложенная ссылка
    /// </summary>
    public class AttachmentLink : AttachmentData
    {
        /// <summary>
        ///     Объект application (если имеется).
        /// </summary>
        public LinkApplication Application { get; set; }

        /// <summary>
        ///     Объект button (если имеется).
        /// </summary>
        public LinkButton Button { get; set; }

        /// <summary>
        ///     Подпись ссылки (если имеется).
        /// </summary>
        public string Caption { get; set; }

        /// <summary>
        ///     Описание
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        ///     Является ли ссылка внешней (true — является, false — не является).
        /// </summary>
        public bool? IsExternal { get; set; }

        /// <summary>
        ///     Изображение превью
        /// </summary>
        public Photo Photo { get; set; }

        /// <summary>
        ///     Идентификатр wiki страницы с контентом для предпросмотра содержимого страницы, который может быть получен используя
        ///     метод pages.get. Идентификатор возвращается в формате "owner_id_page_id"
        /// </summary>
        public string PreviewPage { get; set; }

        /// <summary>
        ///     URL страницы с контентом для предпросмотра содержимого страницы.
        /// </summary>
        public string PreviewUrl { get; set; }

        /// <summary>
        ///     объект product (если имеется).
        /// </summary>
        public LinkProduct Product { get; set; }

        /// <summary>
        ///     объект rating (если имеется).
        /// </summary>
        public LinkRating Rating { get; set; }

        /// <summary>
        ///     Название
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        ///     URL
        /// </summary>
        public string Url { get; set; }

        public AttachmentLink(ApiNode node)
        {
            Url = node.String("url");
            Title = node.String("title");
            Caption = node.String("caption");
            Description = node.String("description");
            Photo = node.Object("photo", x => new Photo(x));
            IsExternal = node.Bool("is_external");

            Product = node.Object("product", x => new LinkProduct(x));
            Rating = node.Object("rating", x => new LinkRating(x));
            Application = node.Object("application", x => new LinkApplication(x));
            Button = node.Object("button", x => new LinkButton(x));

            PreviewPage = node.String("preview_page");
            PreviewUrl = node.String("preview_url");
        }

        /// <summary>
        ///     Объект application, описывающий информацию о приложении из магазина
        /// </summary>
        public class LinkApplication
        {
            /// <summary>
            ///     Идентификатор приложения в магазине
            /// </summary>
            public int? AppId { get; set; }

            /// <summary>
            ///     Объект store, описывающий информацию о магазине
            /// </summary>
            public IdTitleObject Store { get; set; }

            public LinkApplication(ApiNode node)
            {
                Store = node.Object("store", x => new IdTitleObject(x, titleNodeName: "name"));
                AppId = node.Int("app_id");
            }
        }

        /// <summary>
        ///     Объект rating, описывающий информацию о рейтинге продукта,
        /// </summary>
        public class LinkRating
        {
            /// <summary>
            ///     Количество отзывов о продукте
            /// </summary>
            public int? ReviewsCount { get; set; }

            /// <summary>
            ///     Количество звезд у продукта
            /// </summary>
            public int? Stars { get; set; }

            public LinkRating(ApiNode node)
            {
                Stars = node.Int("stars");
                ReviewsCount = node.Int("reviews_count");
            }
        }

        /// <summary>
        ///     Объект product, описывающий информацию о продукте
        /// </summary>
        public class LinkProduct
        {
            /// <summary>
            ///     Объект price, описывающий цену
            /// </summary>
            public ProductPrice Price { get; set; }

            public LinkProduct(ApiNode node)
            {
                Price = node.Object("price", x => new ProductPrice(x));
            }
        }

        /// <summary>
        ///     Объект button, описывающий информацию о кнопке
        /// </summary>
        public class LinkButton
        {
            /// <summary>
            ///     Название кнопки
            /// </summary>
            public string Title { get; set; }

            /// <summary>
            ///     Ссылка на которую ведет кнопка;
            /// </summary>
            public string Url { get; set; }

            public LinkButton(ApiNode node)
            {
                Url = node.String("url");
                Title = node.String("title");
            }
        }
    }
}